// 《围棋》作者版权所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package runtime

import "unsafe"

var inf = float64frombits(0x7FF0000000000000)

// isNaN报告f是否为IEEE 754“not-a-number”值。
func isNaN(f float64) (is bool) {
	// IEEE754说只有NAN满足f！=F
	return f != f
}

// isFinite报告f是否既不是NaN也不是无穷大。
func isFinite(f float64) bool {
	return !isNaN(f - f)
}

// isInf报告f是否为无穷大。
func isInf(f float64) bool {
	return !isNaN(f) && !isFinite(f)
}

// Abs返回x的绝对值。
// 
// 特殊情况为：
// Abs（±Inf）=+Inf 
// Abs（NaN）=NaN 
func abs(x float64) float64 {
	const sign = 1 << 63
	return float64frombits(float64bits(x) &^ sign)
}

// copysign返回一个值，其大小为x的
// 符号为y。
func copysign(x, y float64) float64 {
	const sign = 1 << 63
	return float64frombits(float64bits(x)&^sign | float64bits(y)&sign)
}

// float64位返回f的IEEE 754二进制表示形式。
func float64bits(f float64) uint64 {
	return *(*uint64)(unsafe.Pointer(&f))
}

// Float64frombits返回与
// IEEE 754二进制表示b对应的浮点数。
func float64frombits(b uint64) float64 {
	return *(*float64)(unsafe.Pointer(&b))
}
